#ifndef SLOT_H
#define SLOT_H

#include <vector>

class AbstractDelegate;
/*!
 *	\class AbstractSlot()
 * 	\brief	Classe virtuelle pure utilisé uniquement dans le but de permettre le polymorphisme et ainsi de stocker plusieurs
 * 			objets de type Slot différent dans un vector std
 */
 
class AbstractSlot
{
	public:
    AbstractDelegate * abstractDelegate;
	
	/*!
	 * 	\fn virtual void Run()=0;
	 * 	\brief	Méthode virtuelle pure utilisé pour représenter la méthode qui exécute la fonction slot
	 */
	 
	virtual void Run()=0;
};

/*!	
 * 	\class Slot
 * 	\brief	Représente un slot, à savoir une méthode membre d'un objet, ainsi que l'objet en question, utilisé conjointement avec un délégué
 */
 
template <class T>
class Slot : public AbstractSlot
{
	public :

	T * objetSlot;			/*!<	Objet devant éxécuté la méthode membre associé	*/


        int (T::*pSlot)();		/*!<	Prototype du pointeur de la fonction membre à exécuter  */
        Slot(int (T::*apSlot)(),T * ref);

	void Run();
};

template <class T>
Slot<T>::Slot(int (T::*apSlot)(),T * ref)
{
        pSlot=apSlot;
        objetSlot=ref;
}



template <class T>
void Slot<T>::Run()
{
	(objetSlot->*pSlot)();
}

#endif
